// authMiddleware.js

// 导入需要使用的依赖库或模块
const jwt = require('jsonwebtoken');
const { SECRET_KEY } = require('../config/authConfig');

// 鉴权中间件
async function authMiddleware(ctx, next) {
  try {
    // 从请求头中获取授权信息（例如：JWT token）
    const authHeader = ctx.headers.authorization;
    
    if (!authHeader) {
      // 如果请求头中没有授权信息，表示未登录或未提供访问凭证
      ctx.status = 401;
      ctx.body = { error: '未授权~' };
      return;
    }
    
    // 提取 JWT token
    // const token = authHeader.split(' ')[1];
    const token = authHeader
    
    if (!token) {
      // 如果没有提供有效的 JWT token，表示未登录或未提供访问凭证
      ctx.status = 401;
      ctx.body = { error: '未授权~' };
      return;
    }
    
    // 验证 JWT token 的有效性
    const decoded = jwt.verify(token, SECRET_KEY);
    
    // 将验证结果存储在请求上下文中，以便后续的路由处理函数使用
    ctx.state.user = decoded;
    
    // 执行下一个中间件或路由处理函数
    await next();
  } catch (error) {
    // 处理鉴权失败的情况
    console.log(error);
    ctx.status = 401;
    ctx.body = { error: '认证失败~' };
  }
}

// 验证管理员权限
const authorizeAdmin = async (ctx, next) => {
  // 从上下文对象中获取用户信息
  const { user } = ctx.state;
  // 检查用户是否为管理员
  if (user && user.role === 'admin') {
    // 用户是管理员，继续下一步操作
    await next();
  } else {
    // 用户不是管理员，返回未授权错误
    ctx.status = 401;
    ctx.body = { error: '没有权限访问~' };
  }
};

module.exports = {
  authMiddleware,
  authorizeAdmin,
};
